# 导入 render 和 redirect
from django.shortcuts import render, redirect
# 导入 openai API 和 async-to-sync 包装器
from openai import AsyncOpenAI
from django.utils.decorators import sync_and_async_middleware
from asgiref.sync import sync_to_async

# 从 secret_key 文件导入生成的 API 密钥
from .secret_key import API_KEY

# 实例化异步 API 客户端
client = AsyncOpenAI(api_key=API_KEY)

# 这是处理主页逻辑的主页视图 (异步)
async def home(request):
    try:
        # 同步操作：检查 session 中是否包含 messages 键
        if not await sync_to_async(lambda: 'messages' in request.session)():
            await sync_to_async(lambda: request.session.__setitem__('messages', [
                {"role": "system", "content": "您现在正在与用户聊天，为他们提供全面、简短和简洁的答案."},
            ]))()

        if request.method == 'POST':
            # 从表单获取 prompt 和 temperature（同步）
            prompt = request.POST.get('prompt')
            temperature = float(request.POST.get('temperature', 0.1))

            # 将提示添加到 messages 列表并更新 session（同步）
            await sync_to_async(lambda: request.session['messages'].append({"role": "user", "content": prompt}))()
            request.session.modified = True

            # 异步调用 OpenAI API
            response = await client.chat.completions.create(
                model="gpt-4o",
                messages=request.session['messages'],
                temperature=temperature,
                max_tokens=1000,
            )
            # 格式化响应
            formatted_response = response.choices[0].message.content

            # 将响应添加到 messages 列表并更新 session（同步）
            await sync_to_async(lambda: request.session['messages'].append(
                {"role": "assistant", "content": formatted_response}))()
            request.session.modified = True

            # 使用 sync_to_async 渲染模板
            context = {
                'messages': request.session['messages'],
                'prompt': '',
                'temperature': temperature,
            }
            return await sync_to_async(render)(request, 'assis_home.html', context)

        else:
            # 渲染主页（GET 请求，使用 sync_to_async）
            context = {
                'messages': request.session['messages'],
                'prompt': '',
                'temperature': 0.1,
            }
            return await sync_to_async(render)(request, 'assis_home.html', context)

    except Exception as e:
        print("error: ", e)
        # 异常时重定向到错误页面
        return await sync_to_async(redirect)('error_handler')


# 这是用于清除会话的视图
async def new_chat(request):
    # 清除 messages 列表（同步）
    await sync_to_async(lambda: request.session.pop('messages', None))()
    return await sync_to_async(redirect)('assis_home.html')


# 这是处理错误的视图
async def error_handler(request):
    return await sync_to_async(render)(request, 'assis_404.html')
